import router from '@/router'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import pinia from '@/stores'
import {useUserInfoStore} from '@/stores/userInfo'
import getPageTitle from './utils/get-page-title'

NProgress.configure({showSpinner: false});
const userInfoStore = useUserInfoStore(pinia)


// 不用进行token检查的白名单路径数组
const whiteList = ['/login']

// 路由加载前
router.beforeEach(async (to, from, next) => {
    // 在显示进度条
    NProgress.start()

    // 设置整个页面的标题
    document.title = getPageTitle(to.meta.title as string)

    const token = userInfoStore.token
    // 如果token存在(已经登陆或前面登陆过)
    if (token) {
        // 如果请求的是登陆路由
        if (to.path === '/login') {
            // 直接跳转到根路由, 并完成进度条
            next({path: '/'})
            NProgress.done()
        } else { // 请求的不是登陆路由
            // 是否已经登陆
            const hasLogin = !!userInfoStore.userInfo.name
            // 如果已经登陆直接放行
            if (hasLogin) {
                next()
            } else { // 如果还没有登陆
                try {
                    // 异步请求获取用户信息(包含权限数据) ==> 动态注册用户的权限路由 => 当次跳转不可见
                    await userInfoStore.getInfo()
                    next(to) // 重新跳转去目标路由, 能看到动态添加的异步路由, 且不会丢失参数
                    NProgress.done() // 结束进度条

                } catch (error: any) { // 如果请求处理过程中出错
                    // 重置用户信息
                    await userInfoStore.reset()
                    // 提示错误信息
                    // ElMessage.error(error.message || 'Has Error') // axios拦截器中已经有提示了
                    // 跳转到登陆页面, 并携带原本要跳转的路由路径, 用于登陆成功后跳转
                    next(`/login?redirect=${to.path}`)
                    // 完成进度条
                    NProgress.done()
                }
            }
        }
    } else { // 没有token
        // 如果目标路径在白名单中(是不需要token的路径)
        if (whiteList.indexOf(to.path) !== -1) {
            // 放行
            next()
        } else {
            // 如果没在白名单中, 跳转到登陆路由携带原目标路径
            next(`/login?redirect=${to.path}`)
            // 完成进度条  当次跳转中断了, 要进行一个新的跳转了
            NProgress.done()
        }
    }
})

// 路由加载后
router.afterEach(() => {
    NProgress.done();
})
